home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1320 / 1320.xpi / components / gmManager.js < prev    next >
Text File  |  2010-01-22  |  9KB  |  324 lines

  1. // Gmail Manager
  2. // By Todd Long <longfocus@gmail.com>
  3. // http://www.longfocus.com/firefox/gmanager/
  4.  
  5. // Extension version
  6. const EXTENSION_VERSION = "0.6";
  7.  
  8. // Global account type
  9. const GLOBAL_TYPE = "global";
  10.  
  11. function gmManager()
  12. {
  13.   // Load the services
  14.   this._logger = Components.classes["@longfocus.com/gmanager/logger;1"].getService(Components.interfaces.gmILogger);
  15.   this._parser = Components.classes["@longfocus.com/gmanager/parser;1"].getService(Components.interfaces.gmIParser);
  16.   
  17.   // Initialize the preferences directory
  18.   var directoryService = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
  19.   var prefsDir = directoryService.get("ProfD", Components.interfaces.nsIFile);
  20.   prefsDir.append("gmanager");
  21.   
  22.   // Make sure the preferences directory exists
  23.   if (!prefsDir.exists())
  24.     prefsDir.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0777);
  25.   
  26.   // Initialize the main preferences file
  27.   this._prefsXML = prefsDir.clone();
  28.   this._prefsXML.append("prefs.xml");
  29.   
  30.   // Initialize the backup preferences file
  31.   this._prefsBAK = prefsDir.clone();
  32.   this._prefsBAK.append("prefs.bak");
  33.   
  34.   // Load the preferences
  35.   this.load();
  36. }
  37. gmManager.prototype = {
  38.   _logger: null,
  39.   _parser: null,
  40.   _prefsXML: null,
  41.   _prefsBAK: null,
  42.   _doc: null,
  43.   _accounts: null,
  44.   _accountsRemoved: null,
  45.   
  46.   get version()
  47.   {
  48.     return EXTENSION_VERSION;
  49.   },
  50.   
  51.   get global()
  52.   {
  53.     return this._accounts[GLOBAL_TYPE];
  54.   },
  55.   
  56.   get defaultGlobal()
  57.   {
  58.     return this._createAccount(this._parser.globalNode);
  59.   },
  60.   
  61.   get defaultAccount()
  62.   {
  63.     return this._createAccount(this._parser.accountNode);
  64.   },
  65.   
  66.   load: function()
  67.   {
  68.     // Load the main preferences file
  69.     this._doc = this._parser.open(this._prefsXML);
  70.     
  71.     // Check if the doc exists
  72.     if (!this._doc)
  73.     {
  74.       // Load the backup preferences file
  75.       this._doc = this._parser.open(this._prefsBAK);
  76.       
  77.       // Check if the doc exists
  78.       if (!this._doc)
  79.       {
  80.         this._doc = this._parser.emptyDoc.cloneNode(true);
  81.         this._doc.documentElement.setAttribute("version", EXTENSION_VERSION);
  82.       }
  83.     }
  84.     
  85.     // Load the accounts  
  86.     this._loadAccounts();
  87.   },
  88.   
  89.   _loadAccounts: function()
  90.   {
  91.     var accountsTemp = new Array();
  92.     var accountElements = this._doc.getElementsByTagName("account");
  93.     
  94.     if (!this._accounts)
  95.       this._accounts = new Array();
  96.     
  97.     for (var i = 0; i < accountElements.length; i++)
  98.     {
  99.       var account = this._createAccount(accountElements.item(i));
  100.       var email = this._getEmail(account.node);
  101.       
  102.       if (email in this._accounts)
  103.       {
  104.         this._accounts[email].load(account.node);
  105.         account = this._accounts[email];
  106.         delete this._accounts[email];
  107.       }
  108.       
  109.       accountsTemp[email] = account;
  110.     }
  111.     
  112.     this._accountsRemoved = this._accounts;
  113.     this._accounts = accountsTemp;
  114.   },
  115.   
  116.   _getEmail: function(aNode)
  117.   {
  118.     if (aNode)
  119.       return (aNode.hasAttribute("email") ? aNode.getAttribute("email") : GLOBAL_TYPE);
  120.     return null;
  121.   },
  122.   
  123.   _createAccount: function(aNode)
  124.   {
  125.     // Create the account
  126.     var gmAccount = new Components.Constructor("@longfocus.com/gmanager/account;1", Components.interfaces.gmIAccount, "load");
  127.     return new gmAccount(aNode.cloneNode(true));
  128.   },
  129.   
  130.   save: function()
  131.   {
  132.     // Check if the main preferences file exists
  133.     if (this._prefsXML.exists())
  134.     {
  135.       // Check if the backup preferences file exists
  136.       if (this._prefsBAK.exists())
  137.         this._prefsBAK.remove(false);
  138.       
  139.       // Save the backup preferences file
  140.       this._prefsXML.copyTo(null, this._prefsBAK.leafName);
  141.     }
  142.     
  143.     var accountNodes = this._doc.getElementsByTagName("account");
  144.     
  145.     for (var i = 0; i < accountNodes.length; i++)
  146.     {
  147.       var oldAccountNode = accountNodes.item(i);
  148.       var oldAccountEmail = this._getEmail(oldAccountNode);
  149.       
  150.       if (oldAccountEmail in this._accounts)
  151.       {
  152.         var newAccountNode = this._accounts[oldAccountEmail].node;
  153.         
  154.         if (newAccountNode.hasAttribute("password"))
  155.         {
  156.           var password = newAccountNode.getAttribute("password");
  157.           newAccountNode.removeAttribute("password");
  158.           this._accounts[oldAccountEmail].savePassword(password);
  159.         }
  160.         
  161.         // Replace the account node with the updated one
  162.         this._doc.documentElement.replaceChild(newAccountNode, oldAccountNode);
  163.       }
  164.       else
  165.         this._doc.documentElement.removeChild(oldAccountNode);
  166.     }
  167.     
  168.     // Save the main preferences file
  169.     this._parser.save(this._prefsXML, this._doc);
  170.     
  171.     for (var email in this._accountsRemoved)
  172.       this._accountsRemoved[email].removePassword();
  173.   },
  174.   
  175.   importPrefs: function(aFile)
  176.   {
  177.     var docTemp = this._parser.open(aFile);
  178.     
  179.     if (docTemp)
  180.     {
  181.       this._doc = docTemp;
  182.       
  183.       // Load the accounts  
  184.       this._loadAccounts();
  185.     }
  186.     
  187.     return (docTemp != null);
  188.   },
  189.   
  190.   exportPrefs: function(aFile)
  191.   {
  192.     var docTemp = this._doc.cloneNode(true);
  193.     var accountNodes = docTemp.getElementsByTagName("account");
  194.     
  195.     for (var i = 0; i < accountNodes.length; i++)
  196.     {
  197.       var accountNode = accountNodes.item(i);
  198.       accountNode.removeAttribute("password");
  199.     }
  200.     
  201.     return this._parser.save(aFile, docTemp);
  202.   },
  203.   
  204.   getAccounts: function(aCount)
  205.   {
  206.     var accounts = new Array();
  207.     
  208.     for (var email in this._accounts)
  209.     {
  210.       if (this._accounts[email].type != GLOBAL_TYPE)
  211.         accounts.push(this._accounts[email]);
  212.     }
  213.     
  214.     aCount.value = accounts.length;       
  215.     
  216.     return accounts;
  217.   },
  218.   
  219.   getAccount: function(aEmail)
  220.   {
  221.     if (aEmail in this._accounts)
  222.       return this._accounts[aEmail];
  223.   },
  224.   
  225.   isAccount: function(aEmail)
  226.   {
  227.     return (aEmail in this._accounts);
  228.   },
  229.   
  230.   addAccount: function(aType, aEmail, aAlias, aPassword, aNode)
  231.   {
  232.     // Check if the email account exists
  233.     if (aEmail in this._accounts)
  234.       return null;
  235.     
  236.     // Set the account node
  237.     var node = (aNode ? aNode : this._parser.accountNode.cloneNode(true));
  238.     
  239.     // Set the account details
  240.     node.setAttribute("type", aType);
  241.     node.setAttribute("email", aEmail);
  242.     node.setAttribute("alias", aAlias);
  243.     node.setAttribute("password", aPassword);
  244.     
  245.     // Append the account node
  246.     this._doc.documentElement.appendChild(node);
  247.     
  248.     // Create the account
  249.     this._accounts[aEmail] = this._createAccount(node);
  250.     
  251.     // Check if the email account exists
  252.     if (aEmail in this._accountsRemoved)
  253.     {
  254.       // Remove the account
  255.       delete this._accountsRemoved[aEmail];
  256.     }
  257.     
  258.     // Return the account
  259.     return this._accounts[aEmail];
  260.   },
  261.   
  262.   removeAccount: function(aEmail)
  263.   {
  264.     // Check if the email account exists
  265.     if (aEmail in this._accounts)
  266.     {
  267.       // Add the account to the removed list
  268.       this._accountsRemoved[aEmail] = this._accounts[aEmail];
  269.       
  270.       // Remove the account
  271.       delete this._accounts[aEmail];
  272.     }
  273.   },
  274.   
  275.   QueryInterface: function(iid)
  276.   {
  277.     if (iid.equals(Components.interfaces.gmIManager) ||
  278.         iid.equals(Components.interfaces.nsISupports))
  279.       return this;
  280.     throw Components.results.NS_ERROR_NO_INTERFACE;
  281.   }
  282. }
  283.  
  284. var myModule = {
  285.   firstTime: true,
  286.   
  287.   myCID: Components.ID("{bf43b6d0-f7dd-11da-974d-0800200c9a66}"),
  288.   myDesc: "Mail Accounts Manager",
  289.   myProgID: "@longfocus.com/gmanager/manager;1",
  290.   myFactory: {
  291.     createInstance: function(outer, iid) {
  292.       if (outer != null)
  293.         throw Components.results.NS_ERROR_NO_AGGREGATION;
  294.       
  295.       return (new gmManager()).QueryInterface(iid);
  296.     }
  297.   },
  298.   
  299.   registerSelf: function(compMgr, fileSpec, location, type)
  300.   {
  301.     if (this.firstTime) {
  302.       this.firstTime = false;
  303.       throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
  304.     }
  305.     
  306.     compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  307.     compMgr.registerFactoryLocation(this.myCID, this.myDesc, this.myProgID, fileSpec, location, type);
  308.   },
  309.   
  310.   getClassObject: function(compMgr, cid, iid)
  311.   {
  312.     if (!cid.equals(this.myCID))
  313.       throw Components.results.NS_ERROR_NO_INTERFACE;
  314.     
  315.     if (!iid.equals(Components.interfaces.nsIFactory))
  316.       throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  317.     
  318.     return this.myFactory;
  319.   },
  320.   
  321.   canUnload: function(compMgr) { return true; }
  322. };
  323.  
  324. function NSGetModule(compMgr, fileSpec) { return myModule; }